#pragma once
#include <cmath>
#include <random>
#include <type_traits>
#include <vector>
using namespace std;
template <typename T> bool valueIsSame(T a, T b, const T tol);
template <typename T> bool valueIsSame(T a, T b);
template <typename T> bool valuesIsSame(T *a, T *b, const int N);
template <typename T> bool valuesIsSame(T *a, T *b, const int N, const T tol);
template <typename T>
bool valuesIsSame(vector<vector<T>> a, vector<vector<T>> b, const T tol);

template <typename T>
bool valuesIsSame(vector<vector<T>> a, vector<vector<T>> b);
template <typename T>
bool valuesIsSame(const vector<T> &a, const vector<T> &b, const T tol);
template <typename T> bool valuesIsSame(const vector<T> &a, const vector<T> &b);
template <typename T>
void randint(const int start, const int end, std::vector<T> &cache);
